package admin

import (
	"geekai/api/dto/common"
	"geekai/api/dto/request"
	"geekai/api/handler"
	"geekai/core"
	"geekai/core/types"
	"geekai/model"
	"geekai/utils"
	"github.com/gin-gonic/gin"
	"github.com/golang-jwt/jwt/v5"
	"gorm.io/gorm"
)

type FunctionHandler struct {
	handler.BaseHandler
}

func NewFunctionHandler(app *core.AppServer, db *gorm.DB) *FunctionHandler {
	return &FunctionHandler{handler.BaseHandler{App: app, DB: db}}
}

// Save godoc
// @Summary      创建函数工具
// @Description  创建函数工具
// @Tags         后台管理-函数管理
// @Accept       json
// @Produce      json
// @Param        req   body     common.Function  true  "函数工具信息"
// @Success      200  {object}  types.BizVo{data=common.Function}
// @Router       /api/admin/function/save [post]
// @Security AdminApiKeyAuth
func (h *FunctionHandler) Save(c *gin.Context) {
	var data common.Function
	if err := c.ShouldBindJSON(&data); err != nil {
		utils.ERROR(c, types.InvalidArgs)
		return
	}

	var f = model.Function{
		Id:          data.Id,
		Name:        data.Name,
		Label:       data.Label,
		Description: data.Description,
		Parameters:  utils.JsonEncode(data.Parameters),
		Action:      data.Action,
		Token:       data.Token,
		Enabled:     data.Enabled,
	}

	res := h.DB.Save(&f)
	if res.Error != nil {
		utils.ERROR(c, "操作数据库出现错误："+res.Error.Error())
		return
	}
	data.Id = f.Id
	utils.SUCCESS(c, data)
}

// Set godoc
// @Summary      修改函数指定字段
// @Description  修改函数指定字段
// @Tags         后台管理-函数管理
// @Accept       json
// @Produce      json
// @Param        req   body     request.FunctionSetFiled  true  "函数字段信息"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/function/set [post]
// @Security AdminApiKeyAuth
func (h *FunctionHandler) Set(c *gin.Context) {
	var data request.FunctionSetFiled
	if err := c.ShouldBindJSON(&data); err != nil {
		utils.ERROR(c, types.InvalidArgs)
		return
	}

	err := h.DB.Model(&model.Function{}).Where("id = ?", data.Id).Update(data.Filed, data.Value).Error
	if err != nil {
		utils.ERROR(c, "操作数据库出现错误："+err.Error())
		return
	}
	utils.SUCCESS(c)
}

// List godoc
// @Summary      查询函数列表
// @Description  查询函数列表
// @Tags         后台管理-函数管理
// @Accept       json
// @Produce      json
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/function/list [get]
// @Security AdminApiKeyAuth
func (h *FunctionHandler) List(c *gin.Context) {
	var items []model.Function
	res := h.DB.Find(&items)
	if res.Error != nil {
		utils.ERROR(c, "操作数据库出现错误："+res.Error.Error())
		return
	}
	functions := make([]common.Function, 0)
	for _, v := range items {
		var f common.Function
		err := utils.CopyObject(v, &f)
		if err != nil {
			log.Errorf("拷贝数据出现错误：%v", err)
			continue
		}
		functions = append(functions, f)
	}
	utils.SUCCESS(c, functions)
}

// Remove godoc
// @Summary      删除函数
// @Description  删除函数
// @Tags         后台管理-函数管理
// @Accept       json
// @Produce      json
// @Param        id   query     string  true  "函数Id"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/function/remove [get]
// @Security AdminApiKeyAuth
func (h *FunctionHandler) Remove(c *gin.Context) {
	id := h.GetInt(c, "id", 0)
	if id > 0 {
		err := h.DB.Delete(&model.Function{Id: uint(id)}).Error
		if err != nil {
			utils.ERROR(c, "操作数据库出现错误："+err.Error())
			return
		}
	}
	utils.SUCCESS(c)
}

// GenToken godoc
// @Summary      生成Token
// @Description  生成Token
// @Tags         后台管理-函数管理
// @Accept       json
// @Produce      json
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/function/token [get]
// @Security AdminApiKeyAuth
func (h *FunctionHandler) GenToken(c *gin.Context) {
	// 创建 token
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
		"user_id": 0,
		"expired": 0,
	})
	tokenString, err := token.SignedString([]byte(h.App.Config.Session.SecretKey))
	if err != nil {
		log.Errorf("生成Token失败：%v", err)
		utils.ERROR(c, "生成Token失败："+err.Error())
		return
	}
	utils.SUCCESS(c, tokenString)
}
